﻿using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using U8WebService.Common;
using static System.Net.Mime.MediaTypeNames;
using UFIDA.U8.U8APIFramework;
using System.Web.Services;
using MSXML2;
using UFIDA.U8.U8MOMAPIFramework;
using SqlKata.Execution;
using U8WebService.Models;
using Dapper;
using System.Text;
using System.Configuration;
using System.Data;

namespace U8WebService.BLL
{
    public partial class U8_SaleManagement : WebService
    {
        TxtLogHelper txt = new TxtLogHelper();
        U8_Base loginBase = new U8_Base();
        DbHelper cmd = new DbHelper();
        StringBuilder sb;
    }

    public partial class U8_SaleManagement : WebService
    {
        //public ReturnResult SaleOut(string jsonStr)
        //{
        //    ReturnResult rsl = new ReturnResult();
        //    try
        //    {
        //        txt.AddLogMsg("传入内容为：" + jsonStr);
        //        var json = JsonConvert.DeserializeObject<JObject>(jsonStr);

        //        txt.AddLogMsg("开始调用销售出库");
        //        #region 第一步登录
        //        var loMsg = loginBase.CheckLogin(json["System"]["sAccID"].ToString(), json["System"]["sYear"].ToString(), json["System"]["sUserID"].ToString(), json["System"]["sPassword"].ToString(), json["System"]["sDate"].ToString(), json["System"]["sServer"].ToString());
        //        if (!loMsg.Result)
        //        {
        //            #region 登录失败立即返回结果
        //            rsl.Message = loMsg.Message;
        //            return rsl;
        //            #endregion
        //        }
        //        #endregion
        //        txt.AddLogMsg("登录成功，开始第二步");
        //        //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
        //        U8EnvContext envContext = new U8EnvContext();
        //        envContext.U8Login = (U8Login.clsLogin)loMsg.Data;
        //        txt.AddLogMsg("开始第三步");
        //        //第三步：设置API地址标识(Url)
        //        //当前API：添加新单据的地址标识为：U8API/saleout/Add
        //        U8ApiAddress myApiAddress = new U8ApiAddress("U8API/saleout/Add");
        //        txt.AddLogMsg(string.Format("开始第四步：{0},context:{1}", JsonConvert.SerializeObject(myApiAddress), JsonConvert.SerializeObject(envContext)));
        //        //第四步：构造APIBroker
        //        U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);
        //        txt.AddLogMsg("开始第五步");
        //        //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：32
        //        broker.AssignNormalValue("sVouchType", "32");

        //        #region 主表数据
        //        var header = JsonConvert.DeserializeObject<JObject>(json["Head"].ToString());

        //        DOMDocument domH = new DOMDocumentClass();
        //        string path = Server.MapPath(@"\");
        //        domH.load(path + "\\DomXML\\RdRecord32domhead.xml");
        //        U8APIHelper.FormatDom(ref domH, 1, "A");
        //        MSXML2.IXMLDOMNodeList domNodesHead = domH.childNodes[0].childNodes[1].childNodes;
        //        foreach (var obj in header.Properties())
        //        {
        //            domNodesHead[0].attributes.getNamedItem(obj.Name).nodeValue = obj.Value; //解析json，填充数据（主表）
        //        }
        //        ((IXMLDOMElement)domNodesHead[0]).setAttribute("bWireless", "1");  //解决WebService生成单据慢问题
        //        broker.AssignNormalValue("DomHead", domH);

        //        #endregion

        //        #region 从表数据填充
        //        var list = JsonConvert.DeserializeObject<List<JObject>>(json["List"].ToString());
        //        MSXML2.DOMDocument domB = new DOMDocumentClass();
        //        domB.load(path + "DomXML\\RdRecord32dombody.xml");
        //        U8APIHelper.AddDomDataRow(ref domB, list.Count, "A");

        //        for (int i = 0; i < list.Count; i++)
        //        {
        //            MSXML2.IXMLDOMNodeList domNodesBody = domB.childNodes[0].childNodes[1].childNodes;
        //            foreach (var j in list[i].Properties())
        //            {
        //                domNodesBody[i].attributes.getNamedItem(j.Name).nodeValue = j.Value;
        //            }
        //        }
        //        broker.AssignNormalValue("domBody", domB);
        //        txt.AddLogMsg(string.Format("表体数据构建,表体参数：{0}", json["List"].ToString()));
        //        #endregion
        //        txt.AddLogMsg("参数构建完成");
        //        //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
        //        broker.AssignNormalValue("domPosition", "");

        //        //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

        //        //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
        //        broker.AssignNormalValue("cnnFrom", null);

        //        //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
        //        broker.AssignNormalValue("VouchId", "");

        //        MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocumentClass();
        //        broker.AssignNormalValue("domMsg", domMsg);

        //        //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
        //        broker.AssignNormalValue("bCheck", false);

        //        //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
        //        broker.AssignNormalValue("bBeforCheckStock", false);

        //        //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
        //        broker.AssignNormalValue("bIsRedVouch", new System.Boolean());

        //        //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
        //        broker.AssignNormalValue("sAddedState", "");

        //        //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
        //        broker.AssignNormalValue("bReMote", false);
        //        txt.AddLogMsg("调用API");
        //        #region 第六步：调用API
        //        if (!broker.Invoke())
        //        {
        //            //错误处理
        //            Exception apiEx = broker.GetException();
        //            if (apiEx != null)
        //            {
        //                if (apiEx is MomSysException)
        //                {
        //                    MomSysException sysEx = apiEx as MomSysException;
        //                    rsl.Message = string.Format("系统异常:{0}", sysEx.Message);
        //                    //todo:异常处理
        //                }
        //                else if (apiEx is MomBizException)
        //                {
        //                    MomBizException bizEx = apiEx as MomBizException;
        //                    rsl.Message = string.Format("API异常：{0}", bizEx.Message);
        //                    //todo:异常处理
        //                }
        //                //异常原因
        //                String exReason = broker.GetExceptionString();
        //                if (exReason.Length != 0)
        //                {
        //                    rsl.Message = string.Format("异常原因：{0}", exReason);
        //                }
        //            }
        //            //结束本次调用，释放API资源
        //            broker.Release();
        //            return rsl; ;
        //        }
        //        #endregion

        //        //第七步：获取返回结果

        //        //获取返回值
        //        //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
        //        rsl.Result = Convert.ToBoolean(broker.GetReturnValue());

        //        if (!rsl.Result)
        //        {
        //            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
        //            rsl.Message = broker.GetResult("errMsg") as System.String;
        //        }

        //        if (rsl.Result)
        //        {
        //            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
        //            var saleOutId = broker.GetResult("VouchId") as System.String;

        //            rsl.Data = Seize_cCode_From_RdRecord32(saleOutId);
        //        }

        //        //结束本次调用，释放API资源
        //        broker.Release();
        //        return rsl;

        //    }
        //    catch (Exception ex)
        //    {
        //        rsl.Message = "异常错误：" + ex.Message;
        //    }
        //    return rsl;
        //}

        //string Seize_cCode_From_RdRecord32(string ID)
        //{
        //    var u8Db = new Katabase().U8Db();
        //    var list = u8Db.Query("rdrecord32")
        //        .Where("ID", "=", ID)
        //        .Get<DbRdRecord32>();

        //    return list.FirstOrDefault().cCode;
        //}
    }
    /// <summary>
    /// 直接写库的销售出库
    /// </summary>
    public partial class U8_SaleManagement : WebService
    {
//        public ReturnResult SaleOutDirect(string jsonStr)
//        {
//            var rsl = new ReturnResult();
//            try
//            {
//                //执行的sql语句
//                var sqlList = new List<DbTable>();
//                var dbTable = new DbTable();
//                var json = JsonConvert.DeserializeObject<JObject>(jsonStr);

//                txt.AddLogMsg("开始直接写库的销售出库");
//                txt.AddLogMsg(jsonStr);

//                var cNumber = "";//新增后的流水号
//                var cCode = "";//新增后的单据号
//                var ID = "";
//                var AutoID = "";
//                //Get_TransVouch_MainIndex_SubIndex(out cTVCode, out ID, out AutoID);

//                var u8Db = new Katabase().U8Db();
//                //表头数据
//                var header = JsonConvert.DeserializeObject<JObject>(json["Head"].ToString());
//                //表体数据
//                var bodyList = JsonConvert.DeserializeObject<List<JObject>>(json["List"].ToString());
//                var isBule = json["isBlue"].ToString();
//                var whereDic = new Dictionary<string, object>();
//                //GetIndex_FromProcedure(bodyList.Count, out cTVCode, out ID, out AutoID);
//                var CardNumber = "0303";
//                U8APIHelper.GetIndex_FromProcedure(1, CardNumber, "rd", out cNumber, out cCode, out ID, out AutoID);
//                if (cNumber.Equals("1"))
//                {
//                    U8APIHelper.insertcNumber(CardNumber, cNumber, ref sqlList);
//                }
//                else
//                {
//                    whereDic = new Dictionary<string, object>();
//                    whereDic["CardNumber"] = "0303";
//                    dbTable = new DbTable();
//                    dbTable.tableName = "VoucherHistory";
//                    dbTable.updateValue = new { cNumber = cNumber };
//                    dbTable.whereDic = whereDic;
//                    dbTable.editType = DbTable.otypes.edit;
//                    sqlList.Add(dbTable);
//                }
//                txt.AddLogMsg(string.Format("返回销售出库(rd32)rd的id{0}，autoid{1},CardNumber:{2},cNumber:{3}", ID, AutoID, CardNumber, cNumber));
//                //new DbHelper().TransactionSample(sqlList);
//                txt.AddLogMsg("第一步");

//                var csysbarcode = "||st32|" + cCode;
//                var head_names = header.Properties().Select(p => p.Name).ToList();
//                head_names.Add("cCode");
//                head_names.Add("ID");
//                head_names.Add("csysbarcode");
//                head_names.Add("cDefine11");
//                var head_values = header.Properties().Select(p => p.Value.ToString()).ToList();
//                head_values.Add(cCode);
//                head_values.Add(ID);
//                head_values.Add(csysbarcode);
//                head_values.Add("写库");//写库的销售出库

//                var head_list = new List<IEnumerable<string>>
//                {
//                    head_values
//                };
//                txt.AddLogMsg("第二步");
//                //添加主表信息
//                //var head_result = u8Db.Query("transvouch").Insert(head_names, head_list);
//                dbTable = new DbTable();
//                dbTable.tableName = "rdrecord32";
//                dbTable.tableColumns = head_names;
//                dbTable.insertValues = head_list;
//                dbTable.editType = DbTable.otypes.add;
//                sqlList.Add(dbTable);
//                //


//                var body_names = bodyList[0].Properties().Select(p => p.Name).ToList();
//                body_names.Add("ID");
//                body_names.Add("autoID");
//                body_names.Add("cbsysbarcode");
//                //body_names.Add("cTVCode");

//                var body_list = new List<IEnumerable<string>>();
//                var mes = "";
//                var cWhCode = header["cwhcode"].ToString();

//                for (int i = 0; i < bodyList.Count; i++)
//                {
//                    var body = bodyList[i];

//                    var body_values = bodyList[i].Properties().Select(p => p.Value.ToString()).ToList();
//                    body_values.Add(ID);
//                    var auto_id = (long.Parse(AutoID) + i).ToString().PadLeft(10, '0');
//                    body_values.Add(auto_id);
//                    body_values.Add(csysbarcode+"|"+body["irowno"].ToString());

//                    body_list.Add(body_values);

//                    // 检查现存量，现存量不足，不让进行调拨
//                    var cinvcode = body["cinvcode"].ToString();
//                    var cfree1 = body["cfree1"].ToString();
//                    var cfree2 = body["cfree2"].ToString();
//                    var cfree3 = body["cfree3"].ToString();
//                    var cfree4 = body["cfree4"].ToString();
//                    var goodsPosition = body["cposition"].ToString();
//                    var number = body["iquantity"].ToString();
//                    var idlsid = body["idlsid"].ToString();
//                    var isodid = body["isodid"].ToString();//销售订单字表标识2

//                    decimal iquantity = 0;
//                    if (!CheckCurrentStock(cinvcode, cWhCode, cfree1, cfree3, number,ref iquantity))
//                    {
//                        mes = string.Format("销售出库失败,现存量仅有:{0},出库数量:{1},仓库编码:{2}中存货编码:{3}，" +
//                            "颜色(cFree1):{4},商标(cFree3):{5}的现存量不足", iquantity, number,cWhCode, cinvcode, cfree1, cfree3);
//                        txt.AddLogMsg(mes);
//                        rsl.Message = mes;
//                        return rsl;
//                    }

//                    #region 反写发货单中累计出库数量  已注释
//                    ////获取发货单中存货的数量
//                    //var dispatchCollection = u8Db.Query("DispatchLists")
//                    //       .Where("iDLsID", "=", idlsid)
//                    //       .Get<DbDispatchLists>();
//                    //if (dispatchCollection.Count() < 1)
//                    //{
//                    //    rsl.Message = string.Format("未获取到仓库：{0},存货：{1}，颜色(cFree1):{2},商标(cFree3):{3}的发货单数据", cWhCode, cinvcode, cfree1, cfree3);
//                    //    return rsl;
//                    //}
//                    //var DbDispatchLists = dispatchCollection.FirstOrDefault();
//                    ////发货单发货数量
//                    //var dIQuantity = 0.0;
//                    //dIQuantity = Convert.ToDouble(DbDispatchLists.iQuantity);

//                    ////当前累计出库数量
//                    //var nfOutQuantity = 0.0;
//                    ////最终累计出库数量
//                    //var fOutQuantity = 0.0;
//                    //if (!string.IsNullOrWhiteSpace(DbDispatchLists.fOutQuantity))
//                    //{
//                    //    nfOutQuantity = Convert.ToDouble(DbDispatchLists.fOutQuantity);
//                    //}
//                    //fOutQuantity = nfOutQuantity + Convert.ToDouble(number);
//                    //#region 判断出库数量是否大于发货单未出库数量
//                    //var wckNum = Convert.ToDouble(dIQuantity) - nfOutQuantity;
//                    //if (getNumber(wckNum) < getNumber(Convert.ToDouble(number)))
//                    //{
//                    //    mes = string.Format("存货编码：{0}，" +
//                    //    "仓库编码：{1},颜色(cFree1):{2},商标(cFree3):{3}," +
//                    //    "子表AutoID:{4},子表iDLsID:{5}；的出库数量大于发货单数量," +
//                    //    "发货单数量:{6},未出库数量:{7}，出库数量:{8}", cinvcode, cWhCode,
//                    //    cfree1, cfree3, DbDispatchLists.AutoID, idlsid, dIQuantity, wckNum, number);
//                    //    txt.AddLogMsg(mes);
//                    //    rsl.Message = mes;
//                    //    return rsl;
//                    //}
//                    //#endregion
//                    //whereDic = new Dictionary<string, object>();
//                    //whereDic["AutoID"] = DbDispatchLists.AutoID;
//                    //dbTable = new DbTable();
//                    //dbTable.tableName = "DispatchLists";
//                    //dbTable.whereDic = whereDic;
//                    //dbTable.updateValue = new { fOutQuantity = fOutQuantity };
//                    //dbTable.editType = DbTable.otypes.edit;
//                    //sqlList.Add(dbTable);
//                    //mes = string.Format("反写发货单子表(DispatchLists):存货编码：{0}，" +
//                    //      "仓库编码：{1},cFree1:{2},cFree3:{3}," +
//                    //      "修改前累计出库数量：{4}，修改后累计出库数量：{5}，子表AutoID:{6},子表iDLsID:{7}", cinvcode, cWhCode,
//                    //      cfree1, cfree3, nfOutQuantity, fOutQuantity, DbDispatchLists.AutoID, idlsid);
//                    //txt.AddLogMsg(mes);
//                    #endregion

//                    #region 检测是否有货位，若有需要往存货货位记录表中添加信息
//                    if (!string.IsNullOrWhiteSpace(body["cposition"].ToString()))
//                    {
//                        var cnames = new
//                        {
//                            cInvCode = "cinvcode",
//                            cFree1 = "cfree1",
//                            cFree2 = "cfree2",
//                            cFree3 = "cfree3",
//                            cFree4 = "cfree4",
//                            iQuantity = "iquantity",
//                            cPosCode = "cposition"
//                        };
//                        var citem_names = cnames.GetType().GetProperties().Select(p => p.Name).ToList();
//                        var citem_values = cnames.GetType().GetProperties().Select(p => p.GetValue(cnames).ToString()).ToList();
//                        var citemList = new List<JObject>();
//                        citemList.Add(body);
//                        var citem_list = U8APIHelper.getDataValue(citemList, citem_values);
//                        citem_names.Add("cWhCode");
//                        citem_names.Add("RdsID");//子表Autoid
//                        citem_names.Add("RdID");//主表ID
//                        citem_names.Add("cHandler");//创建人
//                        citem_names.Add("dDate");//单据日期
//                        citem_names.Add("bRdFlag");//出入库标识
//                        citem_names.Add("cvouchtype");//单据类型
//                        citem_names.Add("dVouchDate");//单据日期
//                        citem_names.Add("iTrackId");
//                        var valueList = citem_list[0].ToList();
//                        valueList.Add(cWhCode);
//                        valueList.Add(auto_id);
//                        valueList.Add(ID);
//                        valueList.Add(header["cmaker"].ToString());
//                        valueList.Add(header["ddate"].ToString());
//                        valueList.Add(header["brdflag"].ToString());
//                        valueList.Add(header["cvouchtype"].ToString());
//                        valueList.Add(header["ddate"].ToString());
//                        valueList.Add("0");
//                        var tcitem_list = new List<IEnumerable<string>>();
//                        tcitem_list.Add(valueList);
//                        dbTable = new DbTable();
//                        dbTable.tableName = "InvPosition";
//                        dbTable.tableColumns = citem_names;
//                        dbTable.insertValues = tcitem_list;
//                        dbTable.editType = DbTable.otypes.add;
//                        sqlList.Add(dbTable);
//                        mes = string.Format("销售出库新增货位存货表信息(InvPosition):存货编码：{0}，" +
//                      "仓库编码：{1},cFree1:{2},cFree3:{3}," +
//                      "数量：{4}，" +
//                      "货位：{5}，RdsID：{6},RdID：{7}" +
//                      "", body["cinvcode"].ToString(), cWhCode,
//                     body["cfree1"].ToString(), body["cfree3"].ToString(), body["iquantity"].ToString(), body["cposition"].ToString(),
//                      auto_id, ID);
//                        txt.AddLogMsg(mes);
//                    }
//                    #endregion

//                    #region 判断发生货位现存量并进行修改
//                    if (!string.IsNullOrWhiteSpace(goodsPosition))
//                    {
//                        decimal hwcl = 0;
//                        if (!U8APIHelper.CheckPositionStock(cinvcode, cWhCode, cfree1, cfree3, goodsPosition, number,ref hwcl))
//                        {
//                            mes = string.Format("调拨失败,仓库编码:{0}中存货编码:{1}，" +
//                          "颜色(cFree1):{2},商标(cFree3):{3},货位:{4}上的现存量不足,货位现存量仅有:{5},出库数量:{6}", 
//                          cWhCode, cinvcode, cfree1, cfree3, goodsPosition, hwcl, number);

//                            txt.AddLogMsg(mes);
//                            rsl.Message = mes;
//                            return rsl;
//                        }

//                        #region 修改货位现存量数据
//                        var oPositionCollection = U8APIHelper.getPositionStock(cinvcode, cWhCode, cfree1, cfree3, goodsPosition);
//                        if (oPositionCollection.Count() < 1)
//                        {
//                            mes = string.Format("未获取到现存量信息,仓库编码:{0}中存货编码:{1}，" +
//                                   "颜色(cFree1):{2},商标(cFree3):{3},货位:{4}的现存量不存在", cWhCode, cinvcode, cfree1, cfree3, goodsPosition);
//                            txt.AddLogMsg(mes);
//                            rsl.Message = mes;
//                            return rsl;
//                        }

//                        var oPositionStock = oPositionCollection.FirstOrDefault();
//                        if (oPositionStock != null)
//                        {
//                            //现在的结存数量
//                            var nowIQuantity = oPositionStock.iQuantity;
//                            var endIQuantity = 0.0;
//                            endIQuantity = double.Parse(nowIQuantity) - double.Parse(number);
//                            whereDic = new Dictionary<string, object>();
//                            whereDic["AutoId"] = oPositionStock.AutoID;
//                            dbTable = new DbTable();
//                            dbTable.tableName = "InvPositionsum";
//                            dbTable.updateValue = new { iQuantity = endIQuantity };
//                            dbTable.whereDic = whereDic;
//                            dbTable.editType = DbTable.otypes.edit;
//                            sqlList.Add(dbTable);
//                            mes = string.Format("保存后反写货位现存量表(InvPositionsum):存货编码：{0}，" +
//                         "仓库编码：{1},cFree1:{2},cFree3:{3},货位:{4}," +
//                         "修改前结存数量：{5}，" +
//                         "修改后结存数量：{6}，autoid：{7},", cinvcode, cWhCode,
//                         cfree1, cfree3, goodsPosition, nowIQuantity, endIQuantity, oPositionStock.AutoID);
//                            txt.AddLogMsg(mes);
//                        }

//                        #endregion
//                    }
//                    #endregion

//                    #region 反写现存量表中结存数量（iQuantity ）和待发货数量（fOutQuantity ） 和待入库数量（fInQuantity ） 已注释
//                    ////获取该存货的现存量
//                    //var possibleCollection = U8APIHelper.getCurrentStock(cinvcode, cWhCode, cfree1, cfree3);
//                    //if (possibleCollection.Count() > 0)
//                    //{
//                    //    if (possibleCollection.Count() > 1)
//                    //    {
//                    //        mes = string.Format("在现存量表中查询出多条信息(CurrentStock):存货编码：{0}，" +
//                    //        "仓库编码：{1},cFree1:{2},cFree3:{3},", cinvcode, cWhCode,
//                    //        cfree1, cfree3);
//                    //        rsl.Message = mes;
//                    //        return rsl;
//                    //    }
//                    //    var DbCurrentStock = possibleCollection.FirstOrDefault();
//                    //    //现在结存数量（显存量-此次发货的数量）
//                    //    var nowiQuantity = DbCurrentStock.iQuantity;
//                    //    //现在的待发货数量(发货单数量-此次发货的数量)
//                    //    var nowfOutQuantity = DbCurrentStock.fOutQuantity;
//                    //    //现在的待入库数量(待入库数量-此次发货的数量)
//                    //    var nowfInQuantity = DbCurrentStock.fInQuantity;
//                    //    double endiQuantity = 0.0, endfOutQuantity = 0.0, endfInQuantity = 0.0;
//                    //    endiQuantity = Convert.ToDouble(nowiQuantity) - Convert.ToDouble(number);
//                    //    endfOutQuantity = Convert.ToDouble(nowfOutQuantity);
//                    //    endfInQuantity = Convert.ToDouble(nowfInQuantity);
//                    //    //蓝单是修改待出库数量
//                    //    if (isBule.Equals("1"))
//                    //    {
//                    //        endfOutQuantity = endfOutQuantity - Convert.ToDouble(number);
//                    //    }
//                    //    else
//                    //    {
//                    //        //减少待入库数量时，要取红单的数值不能带负号
//                    //        endfInQuantity = endfInQuantity - getNumber(Convert.ToDouble(number));
//                    //    }

//                    //    whereDic = new Dictionary<string, object>();
//                    //    whereDic["AutoID"] = DbCurrentStock.AutoID;
//                    //    dbTable = new DbTable();
//                    //    dbTable.tableName = "CurrentStock";
//                    //    dbTable.whereDic = whereDic;
//                    //    dbTable.updateValue = new { iQuantity = endiQuantity, fOutQuantity = endfOutQuantity, fInQuantity = endfInQuantity };
//                    //    dbTable.editType = DbTable.otypes.edit;
//                    //    sqlList.Add(dbTable);
//                    //    mes = string.Format("反写现存量表(CurrentStock):存货编码：{0}，" +
//                    //       "仓库编码：{1},cFree1:{2},cFree3:{3}," +
//                    //       "修改前结存数量：{4}，修改后结存数量：{5}，" +
//                    //       "修改前待发货数量：{6}，修改后待发货数量：{7}," +
//                    //       "修改前待入库数量：{8}，修改后待入库数量：{9}", cinvcode, cWhCode,
//                    //       cfree1, cfree3, nowiQuantity, endiQuantity, nowfOutQuantity, endfOutQuantity,
//                    //       nowfInQuantity, endfInQuantity);
//                    //    txt.AddLogMsg(mes);
//                    //}
//                    //else
//                    //{
//                    //    mes = string.Format("在现存量表中未查询到相关信息(CurrentStock):存货编码：{0}，" +
//                    //           "仓库编码：{1},cFree1:{2},cFree3:{3},", cinvcode, cWhCode,
//                    //           cfree1, cfree3);
//                    //    rsl.Message = mes;
//                    //    return rsl;
//                    //}
//                    #endregion

//                    #region 反写销售订单中的出库数量和退货数量 已注释
//                    //if (!string.IsNullOrWhiteSpace(isodid))
//                    //{
//                    //    var soDetailsList = getSo_SoDetails(isodid);
//                    //    if (soDetailsList.Count() < 1)
//                    //    {
//                    //        rsl.Message = string.Format("未获取到仓库：{0},存货：{1}，颜色(cFree1):{2},商标(cFree3):{3}，iSOsID:{4}的销售订单数据", cWhCode, cinvcode, cfree1, cfree3, isodid);
//                    //        return rsl;
//                    //    }
//                    //    //反写出库数量
//                    //    var soDetails = soDetailsList.FirstOrDefault();
//                    //    //当前的出库数量
//                    //    var nowFoutQuantity = 0.0;

//                    //    if (!string.IsNullOrWhiteSpace(soDetails.foutquantity))
//                    //    {
//                    //        nowFoutQuantity = Convert.ToDouble(soDetails.foutquantity);
//                    //    }
//                    //    var nowFretQuantity = 0.0;//当前退货数量
//                    //    if (!string.IsNullOrWhiteSpace(soDetails.fretquantity))
//                    //    {
//                    //        nowFretQuantity = Convert.ToDouble(soDetails.fretquantity);
//                    //    }
//                    //    var foutQuantity = nowFoutQuantity;
//                    //    var fretQuantity = nowFretQuantity;
//                    //    foutQuantity = foutQuantity + Convert.ToDouble(number);

//                    //    whereDic = new Dictionary<string, object>();
//                    //    whereDic["AutoID"] = soDetails.AutoID;
//                    //    dbTable = new DbTable();
//                    //    dbTable.tableName = "SO_SODetails";
//                    //    dbTable.whereDic = whereDic;
//                    //    dbTable.updateValue = new { foutquantity = foutQuantity };
//                    //    dbTable.editType = DbTable.otypes.edit;
//                    //    sqlList.Add(dbTable);
//                    //    mes = string.Format("反写销售订单子表(SO_SODetails):存货编码：{0}，" +
//                    //     "仓库编码：{1},cFree1:{2},cFree3:{3}," +
//                    //     "修改前出库数量：{4}，修改后出库数量：{5}，" +
//                    //     "子表AutoID:{6},子表iSOsID :{7}", cinvcode, cWhCode,
//                    //     cfree1, cfree3, nowFoutQuantity, foutQuantity, soDetails.AutoID, isodid);
//                    //    txt.AddLogMsg(mes);
//                    //}
//                    #endregion


//                }

                
//                var groupedData = bodyList.GroupBy(r => new
//                {
//                    //warehouse= cWhCode,
//                    cinvcode = r["cinvcode"],
//                    cfree1 = r["cfree1"],
//                    cfree3 = r["cfree3"],
//                    idlsid = r["idlsid"],
//                    isodid = r["isodid"],
//                }).Select(a => new
//                {
//                    cinvcode = a.Key.cinvcode,
//                    cfree1 = a.Key.cfree1,
//                    cfree3 = a.Key.cfree3,
//                    idlsid = a.Key.idlsid,
//                    isodid = a.Key.isodid,
//                    number = a.Sum(c => long.Parse(c["iquantity"].ToString()) )
//                }).ToList();

               
//                foreach (var l in groupedData)
//                {
//                    #region 反写发货单中累计出库数量
//                    //var idlsid = l["idlsid"].ToString();
//                    var idlsid = l.idlsid.ToString();

//                    //获取发货单中存货的数量
//                    var dispatchCollection = u8Db.Query("DispatchLists")
//                           .Where("iDLsID", "=", idlsid)
//                           .Get<DbDispatchLists>();
//                    if (dispatchCollection.Count() < 1)
//                    {
//                        rsl.Message = string.Format("未获取到仓库：{0},存货：{1}，颜色(cFree1):{2},商标(cFree3):{3}的发货单数据",
//                            cWhCode, l.cinvcode, l.cfree1, l.cfree3);
//                        return rsl;
//                    }
//                    var DbDispatchLists = dispatchCollection.FirstOrDefault();
//                    //发货单发货数量
//                    var dIQuantity = 0.0;
//                    dIQuantity = Convert.ToDouble(DbDispatchLists.iQuantity);

//                    //当前累计出库数量
//                    var nfOutQuantity = 0.0;
//                    //最终累计出库数量
//                    var fOutQuantity = 0.0;
//                    if (!string.IsNullOrWhiteSpace(DbDispatchLists.fOutQuantity))
//                    {
//                        nfOutQuantity = Convert.ToDouble(DbDispatchLists.fOutQuantity);
//                    }
//                    fOutQuantity = nfOutQuantity + Convert.ToDouble(l.number);
//                    #region 判断出库数量是否大于发货单未出库数量
//                    var wckNum = Convert.ToDouble(dIQuantity) - nfOutQuantity;
//                    if (getNumber(wckNum) < getNumber(Convert.ToDouble(l.number)))
//                    {
//                        mes = string.Format("存货编码：{0}，" +
//                        "仓库编码：{1},颜色(cFree1):{2},商标(cFree3):{3}," +
//                        "子表AutoID:{4},子表iDLsID:{5}；的出库数量大于发货单数量," +
//                        "发货单数量:{6},未出库数量:{7}，出库数量:{8}", l.cinvcode, cWhCode,
//                        l.cfree1, l.cfree3, DbDispatchLists.AutoID, idlsid, dIQuantity, wckNum, l.number);
//                        txt.AddLogMsg(mes);
//                        rsl.Message = mes;
//                        return rsl;
//                    }
//                    #endregion
//                    whereDic = new Dictionary<string, object>();
//                    whereDic["AutoID"] = DbDispatchLists.AutoID;
//                    dbTable = new DbTable();
//                    dbTable.tableName = "DispatchLists";
//                    dbTable.whereDic = whereDic;
//                    dbTable.updateValue = new { fOutQuantity = fOutQuantity };
//                    dbTable.editType = DbTable.otypes.edit;
//                    sqlList.Add(dbTable);
//                    mes = string.Format("反写发货单子表(DispatchLists):存货编码：{0}，" +
//                          "仓库编码：{1},cFree1:{2},cFree3:{3}," +
//                          "修改前累计出库数量：{4}，修改后累计出库数量：{5}，子表AutoID:{6},子表iDLsID:{7}", l.cinvcode, cWhCode,
//                          l.cfree1, l.cfree3, nfOutQuantity, fOutQuantity, DbDispatchLists.AutoID, idlsid);
//                    txt.AddLogMsg(mes);

//                    #endregion

//                    #region 反写现存量表中结存数量（iQuantity ）和待发货数量（fOutQuantity ） 和待入库数量（fInQuantity ）
//                    //获取该存货的现存量
//                    var possibleCollection = U8APIHelper.getCurrentStock(l.cinvcode.ToString(), cWhCode, l.cfree1.ToString(), l.cfree3.ToString());
//                    if (possibleCollection.Count() > 0)
//                    {
//                        if (possibleCollection.Count() > 1)
//                        {
//                            mes = string.Format("在现存量表中查询出多条信息(CurrentStock):存货编码：{0}，" +
//                            "仓库编码：{1},cFree1:{2},cFree3:{3},", l.cinvcode, cWhCode,
//                            l.cfree1, l.cfree3);
//                            rsl.Message = mes;
//                            return rsl;
//                        }
//                        var DbCurrentStock = possibleCollection.FirstOrDefault();
//                        //现在结存数量（显存量-此次发货的数量）
//                        var nowiQuantity = DbCurrentStock.iQuantity;
//                        //现在的待发货数量(发货单数量-此次发货的数量)
//                        var nowfOutQuantity = DbCurrentStock.fOutQuantity;
//                        //现在的待入库数量(待入库数量-此次发货的数量)
//                        var nowfInQuantity = DbCurrentStock.fInQuantity;
//                        double endiQuantity = 0.0, endfOutQuantity = 0.0, endfInQuantity = 0.0;
//                        endiQuantity = Convert.ToDouble(nowiQuantity) - Convert.ToDouble(l.number);
//                        endfOutQuantity = Convert.ToDouble(nowfOutQuantity);
//                        endfInQuantity = Convert.ToDouble(nowfInQuantity);
//                        //蓝单是修改待出库数量
//                        if (isBule.Equals("1"))
//                        {
//                            endfOutQuantity = endfOutQuantity - Convert.ToDouble(l.number);
//                        }
//                        else
//                        {
//                            //减少待入库数量时，要取红单的数值不能带负号
//                            endfInQuantity = endfInQuantity - getNumber(Convert.ToDouble(l.number));
//                        }

//                        whereDic = new Dictionary<string, object>();
//                        whereDic["AutoID"] = DbCurrentStock.AutoID;
//                        dbTable = new DbTable();
//                        dbTable.tableName = "CurrentStock";
//                        dbTable.whereDic = whereDic;
//                        dbTable.updateValue = new { iQuantity = endiQuantity, fOutQuantity = endfOutQuantity, fInQuantity = endfInQuantity };
//                        dbTable.editType = DbTable.otypes.edit;
//                        sqlList.Add(dbTable);
//                        mes = string.Format("反写现存量表(CurrentStock):存货编码：{0}，" +
//                           "仓库编码：{1},cFree1:{2},cFree3:{3}," +
//                           "修改前结存数量：{4}，修改后结存数量：{5}，" +
//                           "修改前待发货数量：{6}，修改后待发货数量：{7}," +
//                           "修改前待入库数量：{8}，修改后待入库数量：{9}", l.cinvcode, cWhCode,
//                           l.cfree1, l.cfree3, nowiQuantity, endiQuantity, nowfOutQuantity, endfOutQuantity,
//                           nowfInQuantity, endfInQuantity);
//                        txt.AddLogMsg(mes);
//                    }
//                    else
//                    {
//                        mes = string.Format("在现存量表中未查询到相关信息(CurrentStock):存货编码：{0}，" +
//                               "仓库编码：{1},cFree1:{2},cFree3:{3},", l.cinvcode, cWhCode,
//                               l.cfree1, l.cfree3);
//                        rsl.Message = mes;
//                        return rsl;
//                    }
//                    #endregion

//                    #region 反写销售订单中的出库数量和退货数量 
//                    var isodid = l.isodid.ToString();
//                    if (!string.IsNullOrWhiteSpace(isodid))
//                    {
//                        var soDetailsList = getSo_SoDetails(isodid);
//                        if (soDetailsList.Count() < 1)
//                        {
//                            rsl.Message = string.Format("未获取到仓库：{0},存货：{1}，颜色(cFree1):{2},商标(cFree3):{3}，iSOsID:{4}的销售订单数据", cWhCode, l.cinvcode, l.cfree1, l.cfree3, isodid);
//                            return rsl;
//                        }
//                        //反写出库数量
//                        var soDetails = soDetailsList.FirstOrDefault();
//                        //当前的出库数量
//                        var nowFoutQuantity = 0.0;

//                        if (!string.IsNullOrWhiteSpace(soDetails.foutquantity))
//                        {
//                            nowFoutQuantity = Convert.ToDouble(soDetails.foutquantity);
//                        }
//                        var nowFretQuantity = 0.0;//当前退货数量
//                        if (!string.IsNullOrWhiteSpace(soDetails.fretquantity))
//                        {
//                            nowFretQuantity = Convert.ToDouble(soDetails.fretquantity);
//                        }
//                        var foutQuantity = nowFoutQuantity;
//                        var fretQuantity = nowFretQuantity;
//                        foutQuantity = foutQuantity + Convert.ToDouble(l.number);

//                        whereDic = new Dictionary<string, object>();
//                        whereDic["AutoID"] = soDetails.AutoID;
//                        dbTable = new DbTable();
//                        dbTable.tableName = "SO_SODetails";
//                        dbTable.whereDic = whereDic;
//                        dbTable.updateValue = new { foutquantity = foutQuantity };
//                        dbTable.editType = DbTable.otypes.edit;
//                        sqlList.Add(dbTable);
//                        mes = string.Format("反写销售订单子表(SO_SODetails):存货编码：{0}，" +
//                         "仓库编码：{1},cFree1:{2},cFree3:{3}," +
//                         "修改前出库数量：{4}，修改后出库数量：{5}，" +
//                         "子表AutoID:{6},子表iSOsID :{7}", l.cinvcode, cWhCode,
//                         l.cfree1, l.cfree3, nowFoutQuantity, foutQuantity, soDetails.AutoID, isodid);
//                        txt.AddLogMsg(mes);
//                    }
//                    #endregion
//                }

//                #region 反写发货单 出库单据号字符串 （cSaleOut ）
//                var cSaleOut = ConfigReader.Reader["cSaleOut"].ToString();   //发货单 出库单据号字符串 （cSaleOut ）
//                if (string.IsNullOrWhiteSpace(cSaleOut))
//                {
//                    cSaleOut = "ST";
//                }
//                else
//                {
//                    if (cSaleOut != "ST")  //如果不是ST，则传销售出库单号
//                    {
//                        cSaleOut = cCode;
//                    }
//                }
//                var DLID = header["cdlcode"].ToString();  //主表id

//                whereDic = new Dictionary<string, object>();
//                whereDic["DLID"] = DLID;
//                dbTable = new DbTable();
//                dbTable.tableName = "DispatchList";
//                dbTable.whereDic = whereDic;
//                dbTable.updateValue = new { cSaleOut = cSaleOut };
//                dbTable.editType = DbTable.otypes.edit;
//                sqlList.Add(dbTable);
//                mes = string.Format("反写发货单主表(DispatchList):出库单据号字符串：{0}，" +
//                          "主表DLID:{1}", cSaleOut, DLID);
//                txt.AddLogMsg(mes);
//                #endregion


//                //添加字表数据
//                //var body_result = u8Db.Query("transvouchs").Insert(body_names, body_list);
//                dbTable = new DbTable();
//                dbTable.tableName = "rdrecords32";
//                dbTable.tableColumns = body_names;
//                dbTable.insertValues = body_list;
//                dbTable.editType = DbTable.otypes.add;
//                sqlList.Add(dbTable);

//                rsl = cmd.TransactionSample(sqlList);
//                if (rsl.Result)
//                {
//                    txt.AddLogMsg(string.Format("新增销售出库单调用结果：true,单据号：{0},主表id{1}", cCode, ID));
//                    //if (head_result > 0 && body_result > 0)
//                    //{
//                    rsl.Result = true;
//                    rsl.Data = cCode;
//                    rsl.Message = "【新增】新增销售出库单成功";

//                    //DrawBack_cTVCode(cTVCode);
//                    var auto_id = (long.Parse(AutoID) + bodyList.Count - 1).ToString().PadLeft(10, '0');
//                    // 还是需要回写，不回写会报错
//                    U8APIHelper.Set_TransVouch_MainIndex_SubIndex("rd", auto_id);

//                }
//                else
//                {
//                    txt.AddLogMsg(string.Format("新增销售出库单调用结果：false,【新增】销售出库单直接出库失败:{0}", rsl.Message));
//                    rsl.Message = "【新增】销售出库单直接出库失败:" + rsl.Message;
//                }
//            }
//            catch (Exception ex)
//            {
//                rsl.Message = ex.Message;
//            }
//            return rsl;
//        }
//        public class output
//        {
//            public string iFatherId { get; set; }
//            public string iChildId { get; set; }
//        }
//        /// <summary>
//        /// 获取销售出库中的单据号和主子表id
//        /// </summary>
//        /// <param name="childNum">字表个数</param>
//        /// <param name="CardNumber">单据单号类型编码</param>
//        /// <param name="cVouchType">id中单据类型</param>
//        /// <param name="cTVCode">单据单号</param>
//        /// <param name="fatherId">主表id</param>
//        /// <param name="childId">字表id</param>
//        void GetIndex_FromProcedure(int childNum, string CardNumber, string cVouchType, out string cNumber, out string cTVCode, out string fatherId, out string childId)
//        {
//            // 获取单据号
//            var u8Db = new Katabase().U8Db();
//            //CardNumber = "0303"(销售出库单); CardNumber = "0304"(调拨单);
//            var codeNumberDic = new Dictionary<string, object>();
//            var codeNumberObject =
//               u8Db
//               .Query("VoucherNumber").Where("CardNumber", CardNumber)
//               .Select("Prefix1", "Prefix1Len", "Prefix1Rule", "GlideLen")
//               .Get<object>().FirstOrDefault();
//            //.Get<Dictionary<string, string>>().FirstOrDefault();
//            codeNumberDic = JsonConvert.DeserializeObject<Dictionary<string, object>>(JsonConvert.SerializeObject(codeNumberObject));
//            var GlideLen = codeNumberDic["GlideLen"].ToString();//流水号长度
//            //流水号编码
//            var maxCodeNumber =
//                u8Db
//                .Query("VoucherHistory").Where("CardNumber", CardNumber)
//                .Select("cNumber")
//                .Get<string>().FirstOrDefault();

//            //var maxCTVCode =
//            //    u8Db.Query("TransVouch").Where("cTVCode", "like", "000%").Max<string>("cTVCode");

//            //获取新增后流水号编码
//            cNumber = (string.IsNullOrEmpty(maxCodeNumber) ? 1 : long.Parse(maxCodeNumber) + 1).ToString();
//            var wCode = (string.IsNullOrEmpty(maxCodeNumber) ? 1 : long.Parse(maxCodeNumber) + 1).ToString().PadLeft(int.Parse(GlideLen), '0');
//            //获取单据号前缀规则
//            var prefix1Code = "";
//            #region  获取前缀1规则生成的编码
//            var Prefix1 = codeNumberDic["Prefix1"].ToString();//前缀1
//            var Prefix1Rule = codeNumberDic["Prefix1Rule"];//前缀1生成规则
//            var Prefix1Len = codeNumberDic["Prefix1Len"].ToString();//前缀1长度
//            if (Prefix1Rule == null || string.IsNullOrWhiteSpace(Prefix1Rule.ToString()))
//            {
//                prefix1Code = prefix1Code.PadLeft(int.Parse(Prefix1Len), '0');
//            }
//            else
//            {
//                var dateStr = "";
//                if (Prefix1Rule.ToString().Equals("年月"))
//                {
//                    dateStr = DateTime.Now.ToString("yyyyMM");
//                }
//                if (Prefix1Rule.ToString().Equals("年月日"))
//                {
//                    dateStr = DateTime.Now.ToString("yyyyMMdd");
//                }
//                if (dateStr.Length >= int.Parse(Prefix1Len))
//                {
//                    var start = dateStr.Length - int.Parse(Prefix1Len);
//                    prefix1Code = dateStr.Substring(start, int.Parse(Prefix1Len));
//                }
//                else
//                {
//                    var start = int.Parse(Prefix1Len) - dateStr.Length;
//                    prefix1Code = dateStr.PadLeft(start, '0');
//                }
//            }
//            #endregion
//            //拼接单据编码
//            cTVCode = prefix1Code + wCode;
//            // 获取两个id
//            var p = new DynamicParameters();
//            //p.Add("")
//            var sql_temp = @"
//declare @iFatherId int; 
//declare @iChildId int; 
//exec sp_getid 
//@cacc_id= '{0}', 
//@cVouchType='{1}', 
//@iAmount={2},  
//@iFatherId = @iFatherId out, 
//@iChildId=@iChildId out; 
//select @iFatherId iFatherId,@iChildId iChildId;";
//            var sql = string.Format(sql_temp, ConfigReader.Reader["DbName"].Split('_')[1], cVouchType, childNum);

//            var outputList = u8Db.Select<output>(sql);

//            //fatherId = (int.Parse(outputList.First().iFatherId) + 1).ToString();
//            //childId = (int.Parse(outputList.First().iChildId) + 1).ToString();
//            //
//            fatherId = (int.Parse(outputList.First().iFatherId)).ToString();
//            childId = (int.Parse(outputList.First().iChildId)).ToString();

//        }
//        /// <summary>
//        /// 检测存货出库时的当前现存量
//        /// </summary>
//        /// <param name="proCode"></param>
//        /// <param name="warehouseCode"></param>
//        /// <param name="color"></param>
//        /// <param name="shangbiao"></param>
//        /// <param name="number"></param>
//        /// <returns></returns>
//        bool CheckCurrentStock(string proCode, string warehouseCode, string color, string shangbiao, string number,ref decimal iquantity)
//        {
//            // 如果是红单，不用判断
//            if (Convert.ToDecimal(number) < 0)
//            {
//                return true;
//            }
//            var u8Db = new Katabase().U8Db();
//            var possibleCollection = U8APIHelper.getCurrentStock(proCode, warehouseCode, color, shangbiao);

//            if (possibleCollection.Count() == 0)
//            {
//                return false;
//            }
//            else
//            {
//                iquantity = possibleCollection.Sum(p => decimal.Parse(p.iQuantity));
//                if (decimal.Parse(number) <= iquantity)
//                {
//                    return true;
//                }
//            }
//            return false;
//        }

//        /// <summary>
//        /// 获取销售订单数据
//        /// </summary>
//        /// <param name="proCode"></param>
//        /// <param name="warehouseCode"></param>
//        /// <param name="color"></param>
//        /// <param name="shangbiao"></param>
//        /// <returns></returns>
//        IEnumerable<DbSO_SODetails> getSo_SoDetails(string iSOsID)
//        {
//            var u8Db = new Katabase().U8Db();
//            var possibleCollection = u8Db.Query("SO_SODetails")
//                   .Where("iSOsID", "=", iSOsID)
//                   .Get<DbSO_SODetails>();
//            return possibleCollection;
//        }
//        /// <summary>
//        /// 获取数值的正值
//        /// </summary>
//        /// <param name="value"></param>
//        /// <returns></returns>
//        double getNumber(double value)
//        {
//            var temValue = value;
//            if (value < 0)
//            {
//                temValue = -value;
//            }
//            return temValue;
//        }
    }

    //生成销售发票
    public partial class U8_SaleManagement : WebService
    {
        //public ReturnResult SaleBillVouch(string jsonStr)
        //{
        //    var rsl = new ReturnResult();
        //    try
        //    {
        //        var json = JsonConvert.DeserializeObject<JObject>(jsonStr);
        //        //表头数据
        //        var header = JsonConvert.DeserializeObject<JObject>(json["Head"].ToString());
        //        //表体数据
        //        var bodyList = JsonConvert.DeserializeObject<List<JObject>>(json["List"].ToString());

        //        List<string> list = new List<string>();

        //        #region 生成销售发票
        //        #region 获取 销售发票主表id（SBVID） 和  销售发票子表id（AutoID）
        //        sb = new StringBuilder();
        //        sb.Append("select MAX(CAST(RIGHT(isnull(SBVID,0),8) AS INT))as id FROM SaleBillVouch");
        //        var table = cmd.getData(sb.ToString());
        //        var SBVID = table.Rows[0]["id"].ToString();

        //        sb.Clear();
        //        sb.Append("select MAX(CAST(RIGHT(isnull(AUTOID,0),8) AS INT))as id FROM SaleBillVouchs");
        //        table = cmd.getData(sb.ToString());
        //        var AutoID = table.Rows[0]["id"].ToString();

        //        //#region 根据单价和折扣金额汇总子表数据
        //        //sb.Clear();
        //        //sb.Append("select price,SUM(zkje) zkje,warehouse,case inOutType when 'cpck'then SUM(jWeight) when 'gjck' then SUM(sjWeight) end jWeight,");
        //        //sb.Append("cInvCode, cInvName from pr_inOut_list where mCode in (" + code.TrimEnd(',') + ") and status='Y' ");
        //        //sb.Append("group by price, zkje,cInvCode,cInvName,inOutType,warehouse ");
        //        //var childtable = cmd.getData(sb.ToString());
        //        //#endregion

        //        //通过存储过程sp_GetID 获得单据表头,表体的Id,     (账套号 单据类型编码 主表标识 子表标识 )
        //        sb.Clear();
        //        sb.Append("exec sp_GetID @cAcc_Id='" + ConfigurationManager.AppSettings["DbName"].Split('_')[1] + "',");
        //        sb.Append("@cVouchType='BILLVOUCH',@iFatherId='" + SBVID + "',@iChildId='" + AutoID + "'");
        //        //sb.Append(",@iAmount=" + childtable.Rows.Count);
        //        sb.Append(",@iAmount=" + bodyList.Count);
        //        cmd.UpdateData(sb.ToString());

        //        //单据编号生成控制表（记录主表、子表id流水号）
        //        sb.Clear();
        //        sb.Append("select convert(int,'100'+right('0000000'+convert(nvarchar(7),iFatherId),7)) iFatherId ");
        //        sb.Append(", convert(int, '100' + right('0000000' + convert(nvarchar(7), iChildId), 7)) iChildId FROM UFSystem..UA_Identity ");
        //        sb.Append("where cAcc_Id='" + ConfigurationManager.AppSettings["DbName"].Split('_')[1] + "' and cVouchType='BILLVOUCH'");
        //        table = cmd.getData(sb.ToString());
        //        SBVID = table.Rows[0]["iFatherId"].ToString();
        //        AutoID = table.Rows[0]["iChildId"].ToString();

        //        #endregion

        //        list = new List<string>();
        //        #region 主表

        //        #region  获取销售发票号 cSBVCode
        //        //var cSBVTime = DateTime.Now.ToString("yyMM");
        //        var cSBVTime2 = DateTime.Now.ToString("yyyyMM");
        //        sb = new StringBuilder();
        //        //sb.Append("select cNumber from VoucherHistory where cardNumber='13' and cSeed = '" + cSBVTime + "'");
        //        sb.Append("select cNumber from VoucherHistory where cardNumber='13' ");
        //        table = cmd.getData(sb.ToString());

        //        string cSBVCode = "";   //销售发票号
        //        var cNumber = "";
        //        int newNum = 0;
        //        if (table.Rows.Count > 0)
        //        {
        //            cNumber = table.Rows[0]["cNumber"].ToString();
        //            newNum = int.Parse(cNumber) + 1;

        //            cSBVCode = cSBVTime2 + newNum.ToString().PadLeft(5, '0');
        //            //if (table.Rows[0]["cNumber"].ToString().Length == 1)
        //            //    cSBVCode = cSBVTime2 + "000" + (int.Parse(cNumber) + 1);
        //            //else if (table.Rows[0]["cNumber"].ToString().Length == 2)
        //            //    cSBVCode = cSBVTime2 + "00" + (int.Parse(cNumber) + 1);
        //            //else if (table.Rows[0]["cNumber"].ToString().Length == 3)
        //            //    cSBVCode = cSBVTime2 + "0" + (int.Parse(cNumber) + 1);
        //            //else if (table.Rows[0]["cNumber"].ToString().Length == 4)
        //            //    cSBVCode = cSBVTime2 + (int.Parse(cNumber) + 1);
        //        }
        //        else
        //        {
        //            sb.Clear();
        //            //sb.Append("insert into VoucherHistory(CardNumber,cContent,cContentRule,cSeed,cNumber,bEmpty) ");
        //            //sb.Append("values('13','单据日期','月','" + cSBVTime + "','0','0')");  
        //            sb.Append("insert into VoucherHistory(CardNumber,cNumber,bEmpty) ");
        //            sb.Append("values('13','0','0')");
        //            cmd.UpdateData(sb.ToString());
        //            cSBVCode = cSBVTime2 + "000" + 1;
        //        }
        //        #endregion

        //        var cSysBarCode = "||SA72|" + cSBVCode;   //表头单据条码

        //        #region 主表数据添加
        //        sb = new StringBuilder();

        //        //cSTCode 销售类型 （02/07）
        //        sb.Append("insert into SaleBillVouch(SBVID,cSBVCode,cVouchType,cSTCode,dDate,cDepCode,cPersonCode,cSOCode,cCusCode,");
        //        sb.Append("cexch_name,cMemo,iExchRate,iTaxRate,bReturnFlag,cBCode,cMaker,cBusType,bFirst,iDisp,cCusName,iVTid,bIAFirst,");
        //        sb.Append("cSource,ioutgolden,bCredit,iverifystate,ireturncount,iswfcontrolled,dcreatesystime,");
        //        sb.Append("iflowid,bcashsale,cSysBarCode");
        //        sb.Append(") values('" + SBVID + "','" + cSBVCode + "','27','02','" + DateTime.Now.ToString("yyyy-MM-dd") + "','02',");
        //        sb.Append("'" + json["System"]["sUserID"].ToString() + "','" + header["csocode"].ToString() + "','");
        //        sb.Append(header["ccuscode"].ToString() + "','人民币','','1','0','0','gsh','");
        //        sb.Append(header["cmaker"].ToString() + "','普通销售','0','0',");
        //        sb.Append("'" + header["ccusname"].ToString() + "','131375','0','销售','0','0','0','0','0',");
        //        sb.Append("'" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "','1','0','" + cSysBarCode + "')");
        //        list.Add(sb.ToString());
        //        #endregion

        //        #endregion

        //        #region  子表
        //        int irowno = 0;  //行号

        //        #region 数据添加
        //        foreach (var s in bodyList)
        //        {
        //            sb.Clear();
        //            irowno++;
        //            var cbSysBarCode = cSysBarCode + "|" + irowno; //单据行条码
        //            var iUnitPrice = "0"; var iTaxUnitPrice = "0"; var iMoney = "0"; var iSum = "0"; var iDisCount = "0";
        //            var iNatUnitPrice = "0"; var iNatMoney = "0"; var iNatSum = "0"; var iNatDisCount = "0";

        //            //decimal iQuotedPrice = decimal.Parse(dr["price"].ToString().Trim());  //报价 即 录入的单价
        //            //                                                                      //价税合计  数量*报价-折扣额 
        //            //decimal jshj = decimal.Parse(dr["jWeight"].ToString()) * iQuotedPrice - decimal.Parse(dr["zkje"].ToString().Trim());
        //            //string Sum = jshj.ToString("f2");  //四舍五入 保留两位

        //            //decimal dj = decimal.Parse(Sum) / decimal.Parse(dr["jWeight"].ToString());  //无税单价
        //            //string Price = dj.ToString("f2");  //四舍五入 保留两位

        //            sb.Append("insert into SaleBillVouchs(SBVID,AutoID,cWhCode,cPosition,cInvCode,iQuantity, iQuotedPrice,iUnitPrice,iTaxUnitPrice,");
        //            sb.Append("iMoney,iTax,iSum,iDisCount, iNatUnitPrice,iNatMoney,iNatTax,iNatSum,iNatDisCount,iSBVID,iMoneySum,iExchSum,");
        //            sb.Append("cMemo,iBatch,bSettleAll,cFree1,iTB,TBQuantity,iSOsID,KL,KL2,cInvName,iTaxRate,fOutQuantity,fOutNum,fSaleCost,fSalePrice,");
        //            sb.Append("cFree3,cSoCode,bgsp,cMassUnit,bQANeedCheck,bQAUrgency,bcosting,fcusminprice,irowno,iExpiratDateCalcu,bneedsign,");
        //            sb.Append("bsaleprice,bgift,bmpforderclosed,cbSysBarCode");
        //            sb.Append(") values('" + SBVID + "','" + AutoID + "','" + s["cwhcode"] + "','" + s["cposition"] + "','" + s["cinvcode"] + "','" + s["iquantity"].ToString());
        //            sb.Append("','0','" + iUnitPrice + "','" + iTaxUnitPrice + "','" + iMoney + "',0,'" + iSum + "','" + iDisCount);
        //            sb.Append("','" + iNatUnitPrice + "','" + iNatMoney + "','0','" + iNatSum + "','" + iNatDisCount + "','0','0','0','");
        //            sb.Append(s["cmemo"] + "','0','0','" + s["cfree1"] + "','0','0','" + s["isosid"].ToString() + "','100','100','");
        //            sb.Append(s["cinvname"] + "','0','0','0','0','0','" + s["cfree3"] + "','" + header["csocode"].ToString() + "','0','0','0','0','1','0','");
        //            sb.Append(irowno + "','0','0','0','0','0','" + cbSysBarCode + "')");
        //            list.Add(sb.ToString());

        //            AutoID = (int.Parse(AutoID) - 1).ToString();

        //        }
        //        #endregion

        //        #endregion

        //        var rsCount = cmd.TransUpdate(list, "U8");

        //        #region  打印日志输出sql
        //        foreach (string s in list)
        //        {
        //            txt.AddLogMsg("生成销售发票sql：" + s);
        //        }

        //        #endregion

        //        #region   提示信息,返写销售发票号和生单人信息
        //        if (rsCount > 0)
        //        {
        //            txt.AddLogMsg("生成销售发票成功！（" + rsCount.ToString() + "）销售发票号：" + cSBVCode);
        //            rsl.Result = true;

        //            sb.Clear();
        //            sb.Append("update VoucherHistory set cNumber=" + newNum + " where cardNumber='13'");
        //            txt.AddLogMsg("修改VoucherHistory表：" + sb.ToString());
        //            cmd.UpdateData(sb.ToString());
        //        }
        //        else
        //        {
        //            rsl.Message = "生成销售发票失败！请联系开发人员！";
        //            txt.AddLogMsg("生成销售发票失败！");
        //        }
        //        #endregion

        //        #endregion
        //    }
        //    catch (Exception ex)
        //    {
        //        rsl.Message = "生成销售发票失败！异常" + ex.Message;
        //        txt.AddLogMsg("生成销售发票失败！异常" + ex.Message);
        //    }
        //    return rsl;
        //}
    }

}